import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart'

// 购物车模块
const cart = {
  // 开启命名空间
  namespaced: true,
  state: () => ({
    list: [] // 购物车列表
  }),
  mutations: {
    // 给list赋值、
    setCart (state, cartList) {
      state.list = cartList
    },
    // // 重新登录更新购物车列表
    update (state, newList) {
      state.list = newList
    }
  },
  actions: {
    // 添加购物车
    async asyncInsertCart (ctx, { skuId, count }) {
      // 调取添加购物车的接口
      await insertCart({ skuId, count })
      const res = await findCartList()
      // console.log(res.data.result)
      ctx.commit('setCart', res.data.result)
    },
    // 删除购物车信息
    async asyncDelCart (ctx, ids) {
      await deleteCart(ids)
      const res = await findCartList()
      // console.log(res.data.result)
      ctx.commit('setCart', res.data.result)
    },
    // 更新购物车的信息
    updateCartList (ctx) {
      findCartList().then(res => {
        ctx.commit('update', res.data.result)
      })
    },
    // 修改购物车的商品状态
    // 小选 点击修改当前对象身上的状态
    async asyncCheck (ctx, goods) {
      await updateCart(goods)
      // console.log(req)
      const res = await findCartList()
      ctx.commit('setCart', res.data.result)
    },
    // 购物车数量模块
    async asyncNumChange(ctx, goods){
      await updateCart(goods)
      // console.log(req)
      const res = await findCartList()
      ctx.commit('setCart', res.data.result)
    },
    // 全选影响小选
    async allCheck (ctx, selected) {
      // selected 传入全选的状态
      // ids是所有商品的数组  取到所有的id
      await checkAllCart({ selected, ids: ctx.state.list.map(item => item.skuId) })
      // 重新拉取购物车列表
      const res = await findCartList()
      // 重新赋值给state
      ctx.commit('setCart', res.data.result)
    }
  },
  getters: {
    // 计算购物车中的金额 但是不会修改state中的数据
    allPrice (state) {
      return state.list.reduce((aucct, value) => {
        return aucct + value.count * value.price
      }, 0)
    },
    // 总数量
    allCount (state) {
      return state.list.reduce((aucct, value) => aucct + value.count, 0)
    },
    // 全选
    // 所有的小选为true 全选才会是true
    allSelected (state) {
      return state.list.every(item => item.selected === true)
    },
    // 选中商品的数量的和
    selectedCount (state) {
      // 通过filter方法得到所有选中的对象
      // 通过reduce方法 得到选中商品的数量
      return state.list.filter(item => item.selected).reduce((acuut, value) => {
        return acuut + value.count
      }, 0)
    },
    // 选中商品的数量和价格 的和
    selectedPrice (state) {
      // 通过filter方法得到所有选中的对象
      // 通过reduce方法 得到所有选中商品的总价格
      return state.list.filter(item => item.selected).reduce((acuut, value) => {
        return acuut + value.count * value.price
      }, 0)
    }

  }
}

export default cart
